/*******************************************************************************
 * Copyright (c) 2002 IBM Corporation and others. All rights reserved. This
 * program and the accompanying materials are made available under the terms of
 * the Common Public License v0.5 which accompanies this distribution, and is
 * available at http://www.eclipse.org/legal/cpl-v05.html
 * 
 * Contributors: IBM - Initial API and implementation Boris Pruessmann -
 * Cleanup, documentation
 ******************************************************************************/
package net.sourceforge.perforce.ui;

import java.util.Arrays;

import org.eclipse.jface.resource.CompositeImageDescriptor;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;

/**
 * An OverlayIcon consists of a main icon and several adornments.
 * 
 * @version $Revision: 488 $
 * @author IBM
 * @author <a href="mailto:bpruessmann@users.sourceforge.net">Boris
 *         Pruessmann</a>
 */
public abstract class OverlayIcon extends CompositeImageDescriptor {
  //----------------------------------------------------------------------------
  // Public Constants

  /** Overlay Location: Top Left */
  public static final int TOP_LEFT = 0;
  /** Overlay Location: Top Right */
  public static final int TOP_RIGHT = 1;
  /** Overlay Location: Bottom Left */
  public static final int BOTTOM_LEFT = 2;
  /** Overlay Location: Bottom Right */
  public static final int BOTTOM_RIGHT = 3;

  // ---------------------------------------------------------------------------
  // Private Variables

  /** the base image */
  private Image base;
  /** the overlay images */
  private ImageDescriptor[] overlays;
  /** the size */
  private Point size;
  /** Stores the locations of the overlay icons. */
  private int[] locations;

  // -------------------------------------------------------------------------
  // Public Constructors

  /**
   * OverlayIcon constructor.
   * 
   * @param base the base image
   * @param overlays the overlay images
   * @param locations the locations of the overlays.
   * @param size the size
   */
  public OverlayIcon(Image base, ImageDescriptor[] overlays, int[] locations, Point size) {
    this.base = base;
    this.overlays = overlays;
    this.locations = locations;
    this.size = size;
  }

  //----------------------------------------------------------------------------
  // -- Public Methods

  @Override
  public boolean equals(Object o) {
    if (!(o instanceof OverlayIcon)) {
      return false;
    }

    OverlayIcon other = (OverlayIcon) o;
    return base.equals(other.base) && Arrays.equals(overlays, other.overlays);
  }

  @Override
  public int hashCode() {
    int code = base.hashCode();
    for (int i = 0; i < overlays.length; i++) {
      code ^= overlays[i].hashCode();
    }
    return code;
  }

  // ---------------------------------------------------------------------------
  // Protected Methods

  /**
   * Superclasses override to draw the overlays.
   * 
   * @param overlays the overlays.
   * @param locations the locations of the overlays.
   */
  protected abstract void drawOverlays(ImageDescriptor[] overlays, int[] locations);

  @Override
  protected void drawCompositeImage(int width, int height) {
    drawImage(base.getImageData(), 0, 0);
    drawOverlays(overlays, locations);
  }

  @Override
  protected Point getSize() {
    return size;
  }
}
